package com.gopay.scheduler.job;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.annotation.Resource;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;

import com.gopay.common.domain.acps.AcctProd;
import com.gopay.common.domain.acps.model.AcctMastBean;
import com.gopay.cron.service.cloud.CloudAccountGenFtpFileService;
import com.gopay.cron.service.cloud.EShopAccountGenFtpFileService;
import com.gopay.remote.acps.service.AcctTransRemoteService;
import com.gopay.scheduler.GopayBaseJob;

/**
 *  云账户掌合生成FTP文件
 * Created by Lenovo-songfengli on 2017/8/22.
 */
public class CloudAccountGenFtpFileJob extends GopayBaseJob {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Value("#{webProperties['cloud.accountGenFtp.custIds']}")
    private String custIds;

    @Value("#{webProperties['cloud.accountGenFtp.basePath']}")
    private String basePath;

    @Resource(name = "cloudAccountGenFtpFileService")
    private CloudAccountGenFtpFileService cloudAccountGenFtpFileService;

    @Resource(name = "acctTransRemoteService")
    private AcctTransRemoteService acctTransRemoteService;
    
    @Resource(name = "eShopAccountGenFtpFileService")
    private EShopAccountGenFtpFileService eShopAccountGenFtpFileService;

    @Override
    public void doJobInternal() {
    	//原生成对账文件逻辑
    	oriGenFile();
    	//生成E商通对账文件逻辑
        genEShopFile();
        
    }

    /**
     * @Description: 原生成对账文件
     * modify by liuxuyang 20180320
     * 之前直接 在 doJobInternal() 方法中编写生成对账文件逻辑
     * 目前新增E商通对账文件逻辑，公用同一个定时任务，拆成单独的方法实现
     * @author liuxuyang
     */
    private void oriGenFile() {
    	try {
            // 获取需要生成对账文件的客户custId
            Set<String> custIdSet = getPlatformCustIds();
            if (custIdSet != null && custIdSet.isEmpty()) {
                logger.info("job end：没有配置需要生成对账文件的custId，job结束");
                return;
            }

            logger.info("需要生成对账文件的custId：" + this.custIds);

            Calendar cal = Calendar.getInstance();
            cal.add(Calendar.DATE, -1);
            String ymd = new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());

            for (String custId : custIdSet) {
                List<AcctMastBean> accts = acctTransRemoteService.getAccounts(custId);
                for (AcctMastBean acct : accts) {
                    //1.生成本地文件及上传FTP(普通账户才生成)
                    if (AcctProd.GNST.toString().equals(acct.getProdCodeStr()) || AcctProd.CLOUD.toString().equals(acct.getProdCodeStr())) {
                        logger.info("custId:" + custId + ",acctId:" + acct.getAcctId() + ",acctProd:" + acct.getProdCodeStr());
                        cloudAccountGenFtpFileService.genFile(basePath, ymd, custId, acct.getAcctId(), acct.getProdCodeStr());
                    }
                }

                //2.清除三十天之前的文件
                String deleteFilePath = basePath + custId + File.separator;   //删除文件的路径
                Calendar calendar = Calendar.getInstance();
                calendar.add(Calendar.DATE, -30);
                String rmd = new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime());
                logger.error("开始清除三十天之前的文件,清除的日期为：" + rmd);
                File path = new File(deleteFilePath + rmd);
                deleteFile(path);
            }
            logger.error("生成云账户对账文件,checkDate=" + ymd + ",custId=" + custIds);
        }catch (Exception e){
            logger.error("生成云账户对账文件失败",e);
        }
    }

    private Set<String> getPlatformCustIds() {
        Set<String> set = new HashSet<>();
        if(this.custIds != null && StringUtils.isNotBlank(this.custIds)) {
            if(this.custIds.contains(",")) {
                String[] strArr = this.custIds.split(",");
                for(int i = 0; i < strArr.length; i++) {
                    set.add(strArr[i]);
                }
            } else {
                set.add(this.custIds);
            }
        }
        return set;
    }

    private void deleteFile(File file) {
        if (file.exists()) {
            if (file.isFile()) {
                file.delete();
            } else if (file.isDirectory()) {
                File[] files = file.listFiles();
                for (int i = 0;i < files.length;i ++) {
                    this.deleteFile(files[i]);
                }
                file.delete();//删除文件夹
            }
        }
    }

    /**
     * @Description: 生成E商通对账文件 
     * @author liuxuyang
     */
    private void genEShopFile() {
    	logger.info("开始生成E商通对账文件...");
    	
    	Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE, -1);
        String ymd = new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
        try {
        	Set<String> custIdSet = getPlatformCustIds();
        	eShopAccountGenFtpFileService.genFile(basePath, ymd,custIdSet);
        } catch(Exception e) {
        	logger.error("生成E商通对账文件失败...",e);
        }
        
        logger.info("生成E商通对账文件结束...");
    }
}
